/**
 * @desc 函数防抖
 * @param func 函数
 * @param wait 延迟毫秒数
 * @param immediate true/false (是/否)即执行
 */
function debounce(func, wait, immediate) {
  let timeout
  return function () {
    const context = this
    const args = arguments

    if (timeout) clearTimeout(timeout)
    if (immediate) {
      const callNow = !timeout
      timeout = setTimeout(() => {
        timeout = null
      }, wait)
      if (callNow) func.apply(context, args)
    } else {
      timeout = setTimeout(function () {
        func.apply(context, args)
      }, wait)
    }
  }
}

/**
 * @desc 提取深层数据的值 (防止中间项不存在导致的报错)
 * @param obj 检测对象
 * @param keyArr 需要获取该对象内部数据的各层级的key所组成的数组
 * @returns {*}
 */
function getDeepValue(obj, keyArr) {
  return keyArr.reduce((acc, key) => acc && acc[key], obj)
}
// 例子：
const demoObj = {
  a: {
    a_1: 'a_1_txt',
    a_2: {
      a_2_1: 'a_2_1_txt',
      a_2_2: 'a_2_2_txt',
    },
  },
  b: 'b_txt',
}
const result = getDeepValue(demoObj, ['a', 'a_2', 'a_2_1'])
console.log(result, '<<<result') // a_2_1_txt

/**
 * @desc 转化成千分位的number格式
 * @param num
 * @param minimumFractionDigits 保留的小数位
 * @returns {string}
 */
function formatNumber(num, minimumFractionDigits = 0) {
  return (+num || 0).toLocaleString('zh', { minimumFractionDigits })
}
// 例子：
const formatNumber_num = 123456
const formatNumber_result = formatNumber(formatNumber_num, 2)
console.log(formatNumber_result, '<<<formatNumber_result') // 123,456.00
